package in.rob.client.fragment; import android.content.Intent; import android.os.Bundle; import android.os.Parcelable; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.Toast; import java.util.List; import in.controller.adapter.ThreadAdapter; import in.controller.adapter.ThreadAdapter.Mode; import in.controller.handler.PostStreamResponseHandler; import in.data.Meta; import in.data.stream.PostStream; import in.data.stream.base.Stream; import in.lib.Constants; import in.lib.manager.APIManager; import in.lib.manager.ResponseManager; import in.lib.manager.SettingsManager; import in.lib.utils.Views.Injectable; import in.lib.writer.CacheWriter; import in.model.AdnModel; import in.model.Post; import in.rob.client.R; import in.rob.client.dialog.ReplyPostDialog; import in.rob.client.fragment.base.StreamFragment; import in.view.delegate.PostDelegate; @Injectable public class ThreadFragment extends StreamFragment { private Post thread; @Override public void onDataReady() { getActivity().invalidateOptionsMenu(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); } @Override public void retrieveArguments(Bundle arguments) { super.retrieveArguments(arguments); if (arguments != null && arguments.containsKey(Constants.EXTRA_POST)) { thread = (Post)arguments.getParcelable(Constants.EXTRA_POST); } else { Toast.makeText(getContext(), R.string.thread_stream_fail, Toast.LENGTH_SHORT).show(); getActivity().finish(); return; } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (thread != null) { outState.putParcelable(Constants.EXTRA_POST, thread); } } @Override public void setupAdapter() { setAdapter(new ThreadAdapter(getContext())); if (thread != null) { PostStream fauxStream = new PostStream(); Meta fauxMeta = new Meta(); fauxMeta.setMoreAvailable(false); fauxMeta.setMinId(thread.getOriginalId()); fauxMeta.setMaxId(thread.getOriginalId()); fauxStream.setMeta(fauxMeta); fauxStream.getItems().add(thread); getAdapter().setStream(fauxStream); ((ThreadAdapter)getAdapter()).setSelectedPost(thread); getAdapter().notifyDataSetChanged(); } } @Override public void setupFooters() { } @Override public void fetchStream(String lastId, boolean append) { PostStreamResponseHandler response = new PostStreamResponseHandler(append); ResponseManager.getInstance().addResponse(getResponseKeys()[0], response, this); if (!append) { APIManager.getInstance().getThreadStart(thread.getThreadId(), thread.getOriginalId(), response); } } @Override public void handleResponse(Stream stream, boolean append) { getRefreshHelper().finish(); if (stream != null && !append) { // ((ThreadAdapter)getAdapter()).setMode(Mode.STANDARD); if (append) { getAdapter().appendStream(stream); } else { getAdapter().setStream(stream); } if (thread != null) { for (Post item : (List<Post>)stream.getItems()) { if (thread.equals(item)) { thread = item; break; } } ((ThreadAdapter)getAdapter()).setSelectedPost(thread); } getAdapter().notifyDataSetChanged(); // write to cache CacheWriter writer = new CacheWriter(getCacheKey()); writer.write(getAdapter().getStream()); } getActivity().invalidateOptionsMenu(); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (((ThreadAdapter)getAdapter()).getMode() == Mode.NESTED) { int pos = position - getListView().getHeaderViewsCount(); int viewType = getAdapter().getItemViewType(pos); if (viewType == ThreadAdapter.TYPE_POST) { ((PostDelegate)((ThreadAdapter)getAdapter()).getItemTypes().get(viewType)).toggleOptions(pos, view); } else if (viewType == ThreadAdapter.TYPE_POST_COLLAPSED_HEADER) { ((PostDelegate)((ThreadAdapter)getAdapter()).getItemTypes().get(viewType)).onItemLongClick(pos, view); } } else { super.onItemClick(parent, view, position, id); } } @Override public void onListItemClick(AdnModel model) { thread = (Post)model; ((ThreadAdapter)getAdapter()).setSelectedPost((Post)model); getAdapter().notifyDataSetChanged(); } @Override public Class getCacheClass() { return PostStream.class; } @Override public String[] getResponseKeys() { return new String[] { String.format(Constants.RESPONSE_THREAD, thread.getThreadId()) }; } @Override public String getCacheKey() { return String.format(Constants.RESPONSE_THREAD, thread.getThreadId()); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_thread, menu); if (getAdapter().getCount() < 2) { menu.findItem(R.id.menu_nest).setVisible(false); } else { if (((ThreadAdapter)getAdapter()).getMode() == Mode.NESTED) { menu.findItem(R.id.menu_nest).setVisible(false); menu.findItem(R.id.menu_denest).setVisible(true); } else { menu.findItem(R.id.menu_nest).setVisible(true); menu.findItem(R.id.menu_denest).setVisible(false); } } super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_nest) { ((ThreadAdapter)getAdapter()).setMode(Mode.NESTED); getAdapter().setStream(getAdapter().getStream()); getAdapter().notifyDataSetChanged(); getActivity().invalidateOptionsMenu(); if (thread != null) { final int itemPos = getAdapter().indexOf(thread); int viewType = getAdapter().getItemViewType(itemPos); int firstPos = getListView().getFirstVisiblePosition() - getListView().getHeaderViewsCount(); int lastPos = getListView().getLastVisiblePosition(); if (itemPos >= firstPos && itemPos <= lastPos) { final int pos = itemPos - firstPos; if (viewType == ThreadAdapter.TYPE_POST) { getListView().post(new Runnable() { @Override public void run() { ((PostDelegate)((ThreadAdapter)getAdapter()).getItemTypes().get(ThreadAdapter.TYPE_POST)).toggleOptions(itemPos, getListView().getChildAt(pos)); } }); } } } return true; } else if (item.getItemId() == R.id.menu_denest) { ((ThreadAdapter)getAdapter()).setMode(Mode.STANDARD); getAdapter().setStream(getAdapter().getStream()); getAdapter().notifyDataSetChanged(); getActivity().invalidateOptionsMenu(); return true; } else if (item.getItemId() == R.id.menu_refresh) { getRefreshHelper().refresh(); } else if (item.getItemId() == R.id.menu_collapse) { SettingsManager.getInstance().collapseThread(thread.getThreadId()); } else if (item.getItemId() == R.id.menu_reply_all) { int count = getAdapter().getCount(); StringBuilder usernames = new StringBuilder(count * 10); for (int index = 0; index < count; index++) { Post post = (Post)getAdapter().getItem(index); if (usernames.indexOf(post.getPoster().getUsername()) < 0 && !post.getPoster().getUsername().equals(thread.getPoster().getUsername())) { if (usernames.length() > 0) { usernames.append(" "); } usernames.append("@").append(post.getPoster().getUsername()); } } Intent replyIntent = new Intent(getContext(), ReplyPostDialog.class); replyIntent.putExtra(Constants.EXTRA_POST, (Parcelable)thread); replyIntent.putExtra(Constants.EXTRA_REPLY_EXTRA, usernames.toString()); startActivity(replyIntent); } return super.onOptionsItemSelected(item); } @Override public int getCacheTimeout() { return 60 * 1 * 1000; } }